Loading Packages

library(tidyverse)
library(janitor)
library(readxl)
library(usmap)
library(stargazer)
library(haven)
library(tigris)
library(rio)
library(standardize)
library(effsize)
library(ggthemes)

Load and Clean Datasets

# Controls v2 from ACS
controls_2019 <- read_csv("controls_2019_v2.csv") %>%
  mutate(total_pop = SE_A00001_001) %>%
  mutate(percent_white = SE_A03001_002/total_pop) %>%
  mutate(percent_bachelors = SE_B12001_004/SE_B12001_001) %>%
  mutate(med_household_income = SE_A14006_001) %>%
  mutate(percent_hispanic = SE_B04001_010/total_pop) %>%
  select(Geo_FIPS, Geo_NAME, Geo_STATE, Geo_COUNTY, total_pop, 
         percent_white, percent_bachelors, med_household_income,
         percent_hispanic) %>%
  mutate(fips = as.numeric(Geo_FIPS))

cbp_2018 <- read_csv("cbp_2018.csv") %>%
  mutate(avg_wage = SE_T1200_001) %>%
  mutate(fips = as.numeric(Geo_FIPS)) %>%
  select(fips, avg_wage)

controls_2019 <- left_join(controls_2019, cbp_2018, by = "fips")
# Other Controls
poverty <- read_excel("PovertyEstimates.xls") %>%
  row_to_names(4) %>%
  clean_names() %>%
  mutate(fips = as.numeric(fip_stxt),
         poverty = as.numeric(pctpovall_2019)/100) %>%
  select(fips, poverty)

unemployment <- read_excel("Unemployment.xlsx") %>%
  row_to_names(4) %>%
  clean_names() %>%
  mutate(fips = as.numeric(fips_code),
         unemp = as.numeric(unemployment_rate_2019)/100) %>%
  select(fips, unemp)

controls_2019 <- controls_2019 %>%
  left_join(poverty, by = "fips") %>%
  left_join(unemployment, by = "fips")
# Import county migration data
c2c1519 <- import_list("c2c1519.xlsx")
c2c1216 <- import_list("c2c1216.xlsx")
c2c0812 <- import_list("c2c0812.xls")

# Rename columns
for (i in 1:52){
  colnames(c2c1519[[i]]) <- c("state_code_a", 
                                          "fips_a", 
                                          "state_code_b",
                                          "fips_b",
                                          "state_name_a",
                                          "county_name_a",
                                          "state_name_b",
                                          "county_name_b",
                                          "flow_ba",
                                          "flow_ba_moe",
                                          "flow_ab",
                                          "flow_ab_moe",
                                          "net_ba",
                                          "net_ba_moe",
                                          "gross_ab",
                                          "gross_ab_moe")
  colnames(c2c1216[[i]]) <- c("state_code_a", 
                                          "fips_a", 
                                          "state_code_b",
                                          "fips_b",
                                          "state_name_a",
                                          "county_name_a",
                                          "state_name_b",
                                          "county_name_b",
                                          "flow_ba",
                                          "flow_ba_moe",
                                          "flow_ab",
                                          "flow_ab_moe",
                                          "net_ba",
                                          "net_ba_moe",
                                          "gross_ab",
                                          "gross_ab_moe")
  colnames(c2c0812[[i]]) <- c("state_code_a", 
                                          "fips_a", 
                                          "state_code_b",
                                          "fips_b",
                                          "state_name_a",
                                          "county_name_a",
                                          "state_name_b",
                                          "county_name_b",
                                          "flow_ba",
                                          "flow_ba_moe",
                                          "flow_ab",
                                          "flow_ab_moe",
                                          "net_ba",
                                          "net_ba_moe",
                                          "gross_ab",
                                          "gross_ab_moe")
}

# Delete extraneous rows
for (i in 1:52){
  c2c1519[[i]] <- c2c1519[[i]] %>%
    filter(!row_number() %in% c(1, 2))
  c2c1216[[i]] <- c2c1216[[i]] %>%
    filter(!row_number() %in% c(1, 2))
  c2c0812[[i]] <- c2c0812[[i]] %>%
    filter(!row_number() %in% c(1, 2))
}

# Bind datasets together by year
c2c1519 <- bind_rows(c2c1519)
c2c1216 <- bind_rows(c2c1216)
c2c0812 <- bind_rows(c2c0812)
# Combine county migration data with controls and election data
df_2020 <- c2c1519 %>%
  filter(is.na(fips_b) == FALSE) %>%
  mutate(comb_fips_a = paste0(state_code_a, fips_a)) %>%
  group_by(county_name_a, comb_fips_a) %>%
  summarize(flow_ba = sum(as.numeric(flow_ba))) %>%
  arrange(comb_fips_a) %>%
  mutate(fips = as.numeric(comb_fips_a))

countypres2020 <- read_csv("countypres_2000-2020.csv") %>%
  filter(year == 2020) %>%
  filter(party == "DEMOCRAT" | party == "REPUBLICAN") %>%
  group_by(county_fips) %>%
  summarize(total_2p_votes = sum(candidatevotes)) %>%
  mutate(fips = as.numeric(county_fips)) %>%
  select(fips, total_2p_votes)

countypres2020_2p <- read_csv("countypres_2000-2020.csv") %>%
  filter(year == 2020) %>%
  filter(party == "DEMOCRAT") %>%
  mutate(fips = as.numeric(county_fips)) %>%
  group_by(fips) %>%
  summarize(candidatevotes = sum(candidatevotes)) %>%
  left_join(countypres2020, by = "fips") %>%
  mutate(dem_percent = candidatevotes/total_2p_votes)

countypres2020_2p_rep <- read_csv("countypres_2000-2020.csv") %>%
  filter(year == 2020) %>%
  filter(party == "REPUBLICAN") %>%
  mutate(fips = as.numeric(county_fips)) %>%
  group_by(fips) %>%
  summarize(candidatevotes = sum(candidatevotes)) %>%
  left_join(countypres2020, by = "fips") %>%
  mutate(rep_percent = candidatevotes/total_2p_votes) %>%
  select(fips, rep_percent)
  

df_2020_election <- left_join(df_2020, countypres2020_2p, by = "fips")

df_2020_combined <- left_join(df_2020_election, controls_2019, by = "fips") %>%
  mutate(avg_immi_rate = flow_ba/total_pop)
df <- df_2020_combined %>%
  filter(Geo_STATE != "02" && Geo_STATE != "72")
write.csv(df, "migration_df.csv")

Immigration

# Basic linear regression
stargazer(lm(dem_percent ~ avg_immi_rate, data = df_2020_combined, weight = total_pop),
          type = "text")

===============================================
                        Dependent variable:    
                    ---------------------------
                            dem_percent        
-----------------------------------------------
avg_immi_rate                -1.542***         
                              (0.132)          
                                               
Constant                     0.609***          
                              (0.008)          
                                               
-----------------------------------------------
Observations                   3,113           
R2                             0.042           
Adjusted R2                    0.042           
Residual Std. Error     53.990 (df = 3111)     
F Statistic          136.485*** (df = 1; 3111) 
===============================================
Note:               *p<0.1; **p<0.05; ***p<0.01
# Visualization of relationship between immigration rate and dem percent
ggplot(df_2020_combined, aes(x = avg_immi_rate, y = dem_percent, size = total_pop)) +
  geom_point(alpha = .3) +
  geom_smooth(method = "lm", aes(weight = total_pop), show.legend = FALSE) +
  labs(title = "Fall in Democratic Voting with Increase in Rate of Immigration",
       x = "Immigration Rate",
       y = "Two-Party Democratic Vote Share",
       subtitle = "2020 Presidential Election",
       caption = "Weighted by County Population")

Check for missing value in the economic data Check Alaska!! What are the patterns we expect to see if this is true, does the data look like what it would if this is happening Have a hypothesis that this should impact behavior, do you see a pattern that isn’t explained by other things Matching Viriginia reports cities and counties around them differently and doesn’t line up - drop ones that don’t align cleanly (fips codes matched things are weird, census has the full county but the data is reported split between the city and everything else) Know things about the places that people are coming from, -1, 0, 1 net partisanship of the people moving into an area, sorting, impact on people there

# Regression with controls
stargazer(lm(dem_percent ~ avg_immi_rate + percent_white + percent_hispanic +
               percent_bachelors + avg_wage + poverty + unemp + med_household_income, data = df_2020_combined,
             weight = total_pop),
          lm(dem_percent ~ avg_immi_rate + percent_white + percent_hispanic +
               percent_bachelors, data = df_2020_combined,
             weight = total_pop),
          lm(dem_percent ~ avg_immi_rate + avg_wage + poverty + unemp + med_household_income, data = df_2020_combined,
             weight = total_pop),
          type = "text")

======================================================================================================
                                                    Dependent variable:                               
                     ---------------------------------------------------------------------------------
                                                        dem_percent                                   
                                 (1)                         (2)                        (3)           
------------------------------------------------------------------------------------------------------
avg_immi_rate                 -0.663***                   -0.668***                  -0.589***        
                               (0.072)                     (0.074)                    (0.107)         
                                                                                                      
percent_white                 -0.476***                   -0.519***                                   
                               (0.011)                     (0.010)                                    
                                                                                                      
percent_hispanic              0.171***                    0.173***                                    
                               (0.010)                     (0.010)                                    
                                                                                                      
percent_bachelors             1.098***                    0.796***                                    
                               (0.024)                     (0.014)                                    
                                                                                                      
avg_wage                     0.00000***                                             0.00001***        
                              (0.00000)                                              (0.00000)        
                                                                                                      
poverty                       -0.230***                                              1.547***         
                               (0.066)                                                (0.093)         
                                                                                                      
unemp                         1.742***                                                 0.004          
                               (0.159)                                                (0.244)         
                                                                                                      
med_household_income         -0.00000***                                            0.00000***        
                              (0.00000)                                              (0.00000)        
                                                                                                      
Constant                      0.618***                    0.652***                   -0.155***        
                               (0.022)                     (0.011)                    (0.025)         
                                                                                                      
------------------------------------------------------------------------------------------------------
Observations                    3,112                       3,113                      3,112          
R2                              0.778                       0.745                      0.440          
Adjusted R2                     0.778                       0.744                      0.439          
Residual Std. Error      26.005 (df = 3103)          27.879 (df = 3108)         41.318 (df = 3106)    
F Statistic          1,361.864*** (df = 8; 3103) 2,267.819*** (df = 4; 3108) 487.790*** (df = 5; 3106)
======================================================================================================
Note:                                                                      *p<0.1; **p<0.05; ***p<0.01
# Regression standardized
df_2020_combined$dem_percent_scaled <- scale(df_2020_combined$dem_percent)[, 1]
df_2020_combined$avg_immi_rate_scaled <- scale(df_2020_combined$avg_immi_rate)[, 1]
df_2020_combined$percent_white_scaled <- scale(df_2020_combined$percent_white)[, 1]
df_2020_combined$percent_bachelors_scaled <- scale(df_2020_combined$percent_bachelors)[, 1]
df_2020_combined$med_household_income_scaled <- scale(df_2020_combined$med_household_income)[, 1]
df_2020_combined$percent_hispanic_scaled <- scale(df_2020_combined$percent_hispanic)[, 1]
df_2020_combined$avg_wage_scaled <- scale(df_2020_combined$avg_wage)[, 1]
df_2020_combined$poverty_scaled <- scale(df_2020_combined$poverty)[, 1]
df_2020_combined$unemp_scaled <- scale(df_2020_combined$unemp)[, 1]

stargazer(lm(dem_percent_scaled ~ avg_immi_rate_scaled + percent_white_scaled + percent_bachelors_scaled + 
               med_household_income_scaled + percent_hispanic_scaled +
               avg_wage_scaled + poverty_scaled + unemp_scaled, data = df_2020_combined,
          weight = total_pop), type = "text")

=======================================================
                                Dependent variable:    
                            ---------------------------
                                dem_percent_scaled     
-------------------------------------------------------
avg_immi_rate_scaled                 -0.116***         
                                      (0.013)          
                                                       
percent_white_scaled                 -0.504***         
                                      (0.012)          
                                                       
percent_bachelors_scaled             0.642***          
                                      (0.014)          
                                                       
med_household_income_scaled          -0.257***         
                                      (0.018)          
                                                       
percent_hispanic_scaled              0.204***          
                                      (0.011)          
                                                       
avg_wage_scaled                      0.068***          
                                      (0.010)          
                                                       
poverty_scaled                       -0.082***         
                                      (0.023)          
                                                       
unemp_scaled                         0.192***          
                                      (0.018)          
                                                       
Constant                             0.239***          
                                      (0.013)          
                                                       
-------------------------------------------------------
Observations                           3,112           
R2                                     0.778           
Adjusted R2                            0.778           
Residual Std. Error             160.019 (df = 3103)    
F Statistic                 1,361.864*** (df = 8; 3103)
=======================================================
Note:                       *p<0.1; **p<0.05; ***p<0.01

Emigration

df_2020_emi <- c2c1519 %>%
  filter(is.na(fips_b) == FALSE) %>%
  mutate(comb_fips_a = paste0(state_code_a, fips_a)) %>%
  group_by(county_name_a, comb_fips_a) %>%
  summarize(flow_ab = sum(as.numeric(flow_ab))) %>%
  arrange(comb_fips_a) %>%
  mutate(fips = as.numeric(comb_fips_a))
`summarise()` has grouped output by 'county_name_a'. You can override using the `.groups` argument.
df_2020_election_emi <- left_join(df_2020_emi, countypres2020_2p, by = "fips")

df_2020_combined_emi <- left_join(df_2020_election_emi, controls_2019, by = "fips") %>%
  mutate(avg_emi_rate = flow_ab/total_pop)
df_emi <- df_2020_combined_emi %>%
  filter(Geo_STATE != "02") %>%
  filter(Geo_STATE != "72")
write.csv(df_emi, "migration_df2.csv")
# Basic regression
stargazer(lm(dem_percent ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop), type = "text")

===============================================
                        Dependent variable:    
                    ---------------------------
                            dem_percent        
-----------------------------------------------
avg_emi_rate                 -0.448**          
                              (0.178)          
                                               
Constant                     0.549***          
                              (0.010)          
                                               
-----------------------------------------------
Observations                   3,113           
R2                             0.002           
Adjusted R2                    0.002           
Residual Std. Error     55.106 (df = 3111)     
F Statistic           6.298** (df = 1; 3111)   
===============================================
Note:               *p<0.1; **p<0.05; ***p<0.01
ggplot(df_2020_combined_emi, aes(x = avg_emi_rate, y = dem_percent, size = total_pop)) +
  geom_point(alpha = .3) +
  geom_smooth(method = "lm", aes(weight = total_pop), show.legend = FALSE) +
  labs(title = "Fall in Democratic Voting with Increase in Rate of Emigration",
       x = "Emigration Rate",
       y = "Two-Party Democratic Vote Share",
       subtitle = "2020 Presidential Election",
       caption = "Weighted by County Population")

stargazer(lm(dem_percent ~ avg_emi_rate + percent_white + percent_hispanic +
               percent_bachelors + avg_wage + poverty + unemp + med_household_income, data = df_2020_combined_emi,
             weight = total_pop), 
          lm(dem_percent ~ avg_emi_rate + percent_white + percent_hispanic +
               percent_bachelors, data = df_2020_combined_emi,
             weight = total_pop),
          lm(dem_percent ~ avg_emi_rate + avg_wage + poverty + unemp + med_household_income, data = df_2020_combined_emi,
             weight = total_pop),
          type = "text")

======================================================================================================
                                                    Dependent variable:                               
                     ---------------------------------------------------------------------------------
                                                        dem_percent                                   
                                 (1)                         (2)                        (3)           
------------------------------------------------------------------------------------------------------
avg_emi_rate                  -0.538***                   -0.591***                  -0.417***        
                               (0.094)                     (0.098)                    (0.140)         
                                                                                                      
percent_white                 -0.485***                   -0.533***                                   
                               (0.011)                     (0.010)                                    
                                                                                                      
percent_hispanic              0.176***                    0.180***                                    
                               (0.010)                     (0.010)                                    
                                                                                                      
percent_bachelors             1.073***                    0.796***                                    
                               (0.024)                     (0.015)                                    
                                                                                                      
avg_wage                     0.00000***                                             0.00001***        
                              (0.00000)                                              (0.00000)        
                                                                                                      
poverty                       -0.237***                                              1.558***         
                               (0.066)                                                (0.093)         
                                                                                                      
unemp                         1.826***                                                 0.167          
                               (0.161)                                                (0.245)         
                                                                                                      
med_household_income         -0.00000***                                            0.00000***        
                              (0.00000)                                              (0.00000)        
                                                                                                      
Constant                      0.607***                    0.656***                   -0.183***        
                               (0.023)                     (0.012)                    (0.025)         
                                                                                                      
------------------------------------------------------------------------------------------------------
Observations                    3,112                       3,113                      3,112          
R2                              0.775                       0.741                      0.436          
Adjusted R2                     0.774                       0.741                      0.435          
Residual Std. Error      26.217 (df = 3103)          28.081 (df = 3108)         41.457 (df = 3106)    
F Statistic          1,333.636*** (df = 8; 3103) 2,224.033*** (df = 4; 3108) 480.322*** (df = 5; 3106)
======================================================================================================
Note:                                                                      *p<0.1; **p<0.05; ***p<0.01

Maps

plot_usmap(data = df_2020_combined, values = "avg_immi_rate", size = .1) +
  scale_fill_continuous(low = "white", "high" = "black") +
  labs(title = "Internal Immigration Rates from 2015-2019")

plot_usmap(data = df_2020_combined_emi, values = "avg_emi_rate", size = .1) +
  scale_fill_continuous(low = "white", "high" = "black") +
  labs(title = "Internal Emigration Rates from 2015-2019")

Regressing on Controls

stargazer(lm(percent_white ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          lm(percent_hispanic ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          lm(percent_bachelors ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          type = "text")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed

================================================================================
                                              Dependent variable:               
                                ------------------------------------------------
                                percent_white percent_hispanic percent_bachelors
                                     (1)            (2)               (3)       
--------------------------------------------------------------------------------
avg_emi_rate                      0.478***       -3.221***         1.322***     
                                   (0.170)        (0.184)           (0.113)     
                                                                                
Constant                          0.698***        0.366***         0.248***     
                                   (0.010)        (0.011)           (0.006)     
                                                                                
--------------------------------------------------------------------------------
Observations                        3,220          3,220             3,220      
R2                                  0.002          0.087             0.041      
Adjusted R2                         0.002          0.086             0.041      
Residual Std. Error (df = 3218)    53.085          57.426           35.105      
F Statistic (df = 1; 3218)        7.883***       305.654***       137.843***    
================================================================================
Note:                                                *p<0.1; **p<0.05; ***p<0.01
stargazer(lm(percent_white ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          lm(percent_hispanic ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          lm(percent_bachelors ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          type = "text")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed

================================================================================
                                              Dependent variable:               
                                ------------------------------------------------
                                percent_white percent_hispanic percent_bachelors
                                     (1)            (2)               (3)       
--------------------------------------------------------------------------------
avg_emi_rate                      0.478***       -3.221***         1.322***     
                                   (0.170)        (0.184)           (0.113)     
                                                                                
Constant                          0.698***        0.366***         0.248***     
                                   (0.010)        (0.011)           (0.006)     
                                                                                
--------------------------------------------------------------------------------
Observations                        3,220          3,220             3,220      
R2                                  0.002          0.087             0.041      
Adjusted R2                         0.002          0.086             0.041      
Residual Std. Error (df = 3218)    53.085          57.426           35.105      
F Statistic (df = 1; 3218)        7.883***       305.654***       137.843***    
================================================================================
Note:                                                *p<0.1; **p<0.05; ***p<0.01
stargazer(lm(avg_wage ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          lm(poverty ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          lm(unemp ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          lm(med_household_income ~ avg_emi_rate, data = df_2020_combined_emi, weight = total_pop),
          type = "text")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed

==========================================================================================================================
                                                             Dependent variable:                                          
                    ------------------------------------------------------------------------------------------------------
                            avg_wage                  poverty                    unemp             med_household_income   
                               (1)                      (2)                       (3)                       (4)           
--------------------------------------------------------------------------------------------------------------------------
avg_emi_rate               15,384.420                -0.171***                 -0.172***               73,601.550***      
                          (15,432.640)                (0.047)                   (0.013)                (18,886.240)       
                                                                                                                          
Constant                  49,381.010***               0.133***                 0.047***                61,268.500***      
                            (889.940)                 (0.003)                   (0.001)                 (1,089.132)       
                                                                                                                          
--------------------------------------------------------------------------------------------------------------------------
Observations                  3,218                    3,141                     3,219                     3,220          
R2                           0.0003                    0.004                     0.052                     0.005          
Adjusted R2                 -0.00000                   0.004                     0.052                     0.004          
Residual Std. Error 4,809,552.000 (df = 3216)    14.755 (df = 3139)        4.036 (df = 3217)     5,887,649.000 (df = 3218)
F Statistic           0.994 (df = 1; 3216)    13.012*** (df = 1; 3139) 176.189*** (df = 1; 3217) 15.187*** (df = 1; 3218) 
==========================================================================================================================
Note:                                                                                          *p<0.1; **p<0.05; ***p<0.01

Thoughts - add cost of living interacting with avg_wage?

stargazer(lm(avg_immi_rate ~ avg_wage, data = df_2020_combined, weight = total_pop),
          lm(avg_immi_rate ~ poverty, data = df_2020_combined, weight = total_pop),
          lm(avg_immi_rate ~ unemp, data = df_2020_combined, weight = total_pop),
          lm(avg_immi_rate ~ med_household_income, data = df_2020_combined, weight = total_pop),
          type = "text")
the condition has length > 1 and only the first element will be usedthe condition has length > 1 and only the first element will be usedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed

=====================================================================================================================
                                                           Dependent variable:                                       
                     ------------------------------------------------------------------------------------------------
                                                              avg_immi_rate                                          
                               (1)                      (2)                       (3)                    (4)         
---------------------------------------------------------------------------------------------------------------------
avg_wage                   -0.00000***                                                                               
                            (0.00000)                                                                                
                                                                                                                     
poverty                                              -0.032***                                                       
                                                      (0.009)                                                        
                                                                                                                     
unemp                                                                          -0.432***                             
                                                                                (0.030)                              
                                                                                                                     
med_household_income                                                                                    -0.000       
                                                                                                      (0.00000)      
                                                                                                                     
Constant                     0.066***                 0.059***                 0.071***                0.055***      
                             (0.001)                  (0.001)                   (0.001)                (0.001)       
                                                                                                                     
---------------------------------------------------------------------------------------------------------------------
Observations                  3,218                    3,141                     3,219                  3,220        
R2                            0.023                    0.004                     0.060                 0.00001       
Adjusted R2                   0.022                    0.004                     0.060                 -0.0003       
Residual Std. Error     7.204 (df = 3216)        7.305 (df = 3139)         7.062 (df = 3217)      7.285 (df = 3218)  
F Statistic          74.375*** (df = 1; 3216) 13.015*** (df = 1; 3139) 207.060*** (df = 1; 3217) 0.040 (df = 1; 3218)
=====================================================================================================================
Note:                                                                                     *p<0.1; **p<0.05; ***p<0.01
ggplot(df_2020_combined, aes(x = avg_immi_rate, y = percent_white, size = total_pop)) +
  geom_point(alpha = .3) +
  geom_smooth(method = "lm", aes(weight = total_pop), show.legend = FALSE) +
  labs(title = "Immigration Rate is Higher in Counties with Higher White Proportion",
       x = "Immigration Rate",
       y = "Proportion White",
       subtitle = "2019",
       caption = "Weighted by County Population")

ggplot(df_2020_combined, aes(x = avg_immi_rate, y = percent_hispanic, size = total_pop)) +
  geom_point(alpha = .3) +
  geom_smooth(method = "lm", aes(weight = total_pop), show.legend = FALSE) +
  labs(title = "Immigration Rate is Lower in Counties with Higher Hispanic Proportion",
       x = "Immigration Rate",
       y = "Proportion Hispanic",
       subtitle = "2019",
       caption = "Weighted by County Population")

ggplot(df_2020_combined_emi, aes(x = avg_emi_rate, y = percent_white, size = total_pop)) +
  geom_point(alpha = .3) +
  geom_smooth(method = "lm", aes(weight = total_pop), show.legend = FALSE) +
  labs(title = "Emigration Rate is Higher in Counties with Higher White Proportion",
       x = "Emigration Rate",
       y = "Proportion White",
       subtitle = "2019",
       caption = "Weighted by County Population")

ggplot(df_2020_combined_emi, aes(x = avg_emi_rate, y = percent_hispanic, size = total_pop)) +
  geom_point(alpha = .3) +
  geom_smooth(method = "lm", aes(weight = total_pop), show.legend = FALSE) +
  labs(title = "Emigration Rate is Lower in Counties with Higher Hispanic Proportion",
       x = "Emigration Rate",
       y = "Proportion Hispanic",
       subtitle = "2019",
       caption = "Weighted by County Population")

ggplot(df_2020_combined, aes(x = avg_immi_rate, y = percent_bachelors, size = total_pop)) +
  geom_point(alpha = .3) +
  geom_smooth(method = "lm", aes(weight = total_pop), show.legend = FALSE) +
  labs(title = "Immigration Rate is Higher in Counties with Higher Bachelor's Proportion",
       x = "Immigration Rate",
       y = "Percent Bachelor's Degree",
       subtitle = "2019",
       caption = "Weighted by County Population")

ggplot(df_2020_combined_emi, aes(x = avg_emi_rate, y = percent_bachelors, size = total_pop)) +
  geom_point(alpha = .3) +
  geom_smooth(method = "lm", aes(weight = total_pop), show.legend = FALSE) +
  labs(title = "Emigration Rate is Higher in Counties with Higher Bachelor's Proportion",
       x = "Emigration Rate",
       y = "Percent Bachelor's Degree",
       subtitle = "2019",
       caption = "Weighted by County Population")

LS0tCnRpdGxlOiAiRHJhZnQgMSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBMb2FkaW5nIFBhY2thZ2VzCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShqYW5pdG9yKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeSh1c21hcCkKbGlicmFyeShzdGFyZ2F6ZXIpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkodGlncmlzKQpsaWJyYXJ5KHJpbykKbGlicmFyeShzdGFuZGFyZGl6ZSkKbGlicmFyeShlZmZzaXplKQpsaWJyYXJ5KGdndGhlbWVzKQpgYGAKCiMgTG9hZCBhbmQgQ2xlYW4gRGF0YXNldHMKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyBDb250cm9scyB2MiBmcm9tIEFDUwpjb250cm9sc18yMDE5IDwtIHJlYWRfY3N2KCJjb250cm9sc18yMDE5X3YyLmNzdiIpICU+JQogIG11dGF0ZSh0b3RhbF9wb3AgPSBTRV9BMDAwMDFfMDAxKSAlPiUKICBtdXRhdGUocGVyY2VudF93aGl0ZSA9IFNFX0EwMzAwMV8wMDIvdG90YWxfcG9wKSAlPiUKICBtdXRhdGUocGVyY2VudF9iYWNoZWxvcnMgPSBTRV9CMTIwMDFfMDA0L1NFX0IxMjAwMV8wMDEpICU+JQogIG11dGF0ZShtZWRfaG91c2Vob2xkX2luY29tZSA9IFNFX0ExNDAwNl8wMDEpICU+JQogIG11dGF0ZShwZXJjZW50X2hpc3BhbmljID0gU0VfQjA0MDAxXzAxMC90b3RhbF9wb3ApICU+JQogIHNlbGVjdChHZW9fRklQUywgR2VvX05BTUUsIEdlb19TVEFURSwgR2VvX0NPVU5UWSwgdG90YWxfcG9wLCAKICAgICAgICAgcGVyY2VudF93aGl0ZSwgcGVyY2VudF9iYWNoZWxvcnMsIG1lZF9ob3VzZWhvbGRfaW5jb21lLAogICAgICAgICBwZXJjZW50X2hpc3BhbmljKSAlPiUKICBtdXRhdGUoZmlwcyA9IGFzLm51bWVyaWMoR2VvX0ZJUFMpKQoKY2JwXzIwMTggPC0gcmVhZF9jc3YoImNicF8yMDE4LmNzdiIpICU+JQogIG11dGF0ZShhdmdfd2FnZSA9IFNFX1QxMjAwXzAwMSkgJT4lCiAgbXV0YXRlKGZpcHMgPSBhcy5udW1lcmljKEdlb19GSVBTKSkgJT4lCiAgc2VsZWN0KGZpcHMsIGF2Z193YWdlKQoKY29udHJvbHNfMjAxOSA8LSBsZWZ0X2pvaW4oY29udHJvbHNfMjAxOSwgY2JwXzIwMTgsIGJ5ID0gImZpcHMiKQpgYGAKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyBPdGhlciBDb250cm9scwpwb3ZlcnR5IDwtIHJlYWRfZXhjZWwoIlBvdmVydHlFc3RpbWF0ZXMueGxzIikgJT4lCiAgcm93X3RvX25hbWVzKDQpICU+JQogIGNsZWFuX25hbWVzKCkgJT4lCiAgbXV0YXRlKGZpcHMgPSBhcy5udW1lcmljKGZpcF9zdHh0KSwKICAgICAgICAgcG92ZXJ0eSA9IGFzLm51bWVyaWMocGN0cG92YWxsXzIwMTkpLzEwMCkgJT4lCiAgc2VsZWN0KGZpcHMsIHBvdmVydHkpCgp1bmVtcGxveW1lbnQgPC0gcmVhZF9leGNlbCgiVW5lbXBsb3ltZW50Lnhsc3giKSAlPiUKICByb3dfdG9fbmFtZXMoNCkgJT4lCiAgY2xlYW5fbmFtZXMoKSAlPiUKICBtdXRhdGUoZmlwcyA9IGFzLm51bWVyaWMoZmlwc19jb2RlKSwKICAgICAgICAgdW5lbXAgPSBhcy5udW1lcmljKHVuZW1wbG95bWVudF9yYXRlXzIwMTkpLzEwMCkgJT4lCiAgc2VsZWN0KGZpcHMsIHVuZW1wKQoKY29udHJvbHNfMjAxOSA8LSBjb250cm9sc18yMDE5ICU+JQogIGxlZnRfam9pbihwb3ZlcnR5LCBieSA9ICJmaXBzIikgJT4lCiAgbGVmdF9qb2luKHVuZW1wbG95bWVudCwgYnkgPSAiZmlwcyIpCmBgYAoKYGBge3IsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIEltcG9ydCBjb3VudHkgbWlncmF0aW9uIGRhdGEKYzJjMTUxOSA8LSBpbXBvcnRfbGlzdCgiYzJjMTUxOS54bHN4IikKYzJjMTIxNiA8LSBpbXBvcnRfbGlzdCgiYzJjMTIxNi54bHN4IikKYzJjMDgxMiA8LSBpbXBvcnRfbGlzdCgiYzJjMDgxMi54bHMiKQoKIyBSZW5hbWUgY29sdW1ucwpmb3IgKGkgaW4gMTo1Mil7CiAgY29sbmFtZXMoYzJjMTUxOVtbaV1dKSA8LSBjKCJzdGF0ZV9jb2RlX2EiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpcHNfYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdGVfY29kZV9iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpcHNfYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZV9uYW1lX2EiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bnR5X25hbWVfYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZV9uYW1lX2IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bnR5X25hbWVfYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG93X2JhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb3dfYmFfbW9lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb3dfYWIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvd19hYl9tb2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV0X2JhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldF9iYV9tb2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jvc3NfYWIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jvc3NfYWJfbW9lIikKICBjb2xuYW1lcyhjMmMxMjE2W1tpXV0pIDwtIGMoInN0YXRlX2NvZGVfYSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlwc19hIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGF0ZV9jb2RlX2IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlwc19iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlX25hbWVfYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudHlfbmFtZV9hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlX25hbWVfYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VudHlfbmFtZV9iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb3dfYmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvd19iYV9tb2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvd19hYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG93X2FiX21vZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXRfYmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV0X2JhX21vZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm9zc19hYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm9zc19hYl9tb2UiKQogIGNvbG5hbWVzKGMyYzA4MTJbW2ldXSkgPC0gYygic3RhdGVfY29kZV9hIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaXBzX2EiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlX2NvZGVfYiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaXBzX2IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdGVfbmFtZV9hIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50eV9uYW1lX2EiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhdGVfbmFtZV9iIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdW50eV9uYW1lX2IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvd19iYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG93X2JhX21vZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmbG93X2FiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb3dfYWJfbW9lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldF9iYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXRfYmFfbW9lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3NzX2FiIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3NzX2FiX21vZSIpCn0KCiMgRGVsZXRlIGV4dHJhbmVvdXMgcm93cwpmb3IgKGkgaW4gMTo1Mil7CiAgYzJjMTUxOVtbaV1dIDwtIGMyYzE1MTlbW2ldXSAlPiUKICAgIGZpbHRlcighcm93X251bWJlcigpICVpbiUgYygxLCAyKSkKICBjMmMxMjE2W1tpXV0gPC0gYzJjMTIxNltbaV1dICU+JQogICAgZmlsdGVyKCFyb3dfbnVtYmVyKCkgJWluJSBjKDEsIDIpKQogIGMyYzA4MTJbW2ldXSA8LSBjMmMwODEyW1tpXV0gJT4lCiAgICBmaWx0ZXIoIXJvd19udW1iZXIoKSAlaW4lIGMoMSwgMikpCn0KCiMgQmluZCBkYXRhc2V0cyB0b2dldGhlciBieSB5ZWFyCmMyYzE1MTkgPC0gYmluZF9yb3dzKGMyYzE1MTkpCmMyYzEyMTYgPC0gYmluZF9yb3dzKGMyYzEyMTYpCmMyYzA4MTIgPC0gYmluZF9yb3dzKGMyYzA4MTIpCmBgYAoKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyBDb21iaW5lIGNvdW50eSBtaWdyYXRpb24gZGF0YSB3aXRoIGNvbnRyb2xzIGFuZCBlbGVjdGlvbiBkYXRhCmRmXzIwMjAgPC0gYzJjMTUxOSAlPiUKICBmaWx0ZXIoaXMubmEoZmlwc19iKSA9PSBGQUxTRSkgJT4lCiAgbXV0YXRlKGNvbWJfZmlwc19hID0gcGFzdGUwKHN0YXRlX2NvZGVfYSwgZmlwc19hKSkgJT4lCiAgZ3JvdXBfYnkoY291bnR5X25hbWVfYSwgY29tYl9maXBzX2EpICU+JQogIHN1bW1hcml6ZShmbG93X2JhID0gc3VtKGFzLm51bWVyaWMoZmxvd19iYSkpKSAlPiUKICBhcnJhbmdlKGNvbWJfZmlwc19hKSAlPiUKICBtdXRhdGUoZmlwcyA9IGFzLm51bWVyaWMoY29tYl9maXBzX2EpKQoKY291bnR5cHJlczIwMjAgPC0gcmVhZF9jc3YoImNvdW50eXByZXNfMjAwMC0yMDIwLmNzdiIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMjApICU+JQogIGZpbHRlcihwYXJ0eSA9PSAiREVNT0NSQVQiIHwgcGFydHkgPT0gIlJFUFVCTElDQU4iKSAlPiUKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lCiAgc3VtbWFyaXplKHRvdGFsXzJwX3ZvdGVzID0gc3VtKGNhbmRpZGF0ZXZvdGVzKSkgJT4lCiAgbXV0YXRlKGZpcHMgPSBhcy5udW1lcmljKGNvdW50eV9maXBzKSkgJT4lCiAgc2VsZWN0KGZpcHMsIHRvdGFsXzJwX3ZvdGVzKQoKY291bnR5cHJlczIwMjBfMnAgPC0gcmVhZF9jc3YoImNvdW50eXByZXNfMjAwMC0yMDIwLmNzdiIpICU+JQogIGZpbHRlcih5ZWFyID09IDIwMjApICU+JQogIGZpbHRlcihwYXJ0eSA9PSAiREVNT0NSQVQiKSAlPiUKICBtdXRhdGUoZmlwcyA9IGFzLm51bWVyaWMoY291bnR5X2ZpcHMpKSAlPiUKICBncm91cF9ieShmaXBzKSAlPiUKICBzdW1tYXJpemUoY2FuZGlkYXRldm90ZXMgPSBzdW0oY2FuZGlkYXRldm90ZXMpKSAlPiUKICBsZWZ0X2pvaW4oY291bnR5cHJlczIwMjAsIGJ5ID0gImZpcHMiKSAlPiUKICBtdXRhdGUoZGVtX3BlcmNlbnQgPSBjYW5kaWRhdGV2b3Rlcy90b3RhbF8ycF92b3RlcykKCmNvdW50eXByZXMyMDIwXzJwX3JlcCA8LSByZWFkX2NzdigiY291bnR5cHJlc18yMDAwLTIwMjAuY3N2IikgJT4lCiAgZmlsdGVyKHllYXIgPT0gMjAyMCkgJT4lCiAgZmlsdGVyKHBhcnR5ID09ICJSRVBVQkxJQ0FOIikgJT4lCiAgbXV0YXRlKGZpcHMgPSBhcy5udW1lcmljKGNvdW50eV9maXBzKSkgJT4lCiAgZ3JvdXBfYnkoZmlwcykgJT4lCiAgc3VtbWFyaXplKGNhbmRpZGF0ZXZvdGVzID0gc3VtKGNhbmRpZGF0ZXZvdGVzKSkgJT4lCiAgbGVmdF9qb2luKGNvdW50eXByZXMyMDIwLCBieSA9ICJmaXBzIikgJT4lCiAgbXV0YXRlKHJlcF9wZXJjZW50ID0gY2FuZGlkYXRldm90ZXMvdG90YWxfMnBfdm90ZXMpICU+JQogIHNlbGVjdChmaXBzLCByZXBfcGVyY2VudCkKICAKCmRmXzIwMjBfZWxlY3Rpb24gPC0gbGVmdF9qb2luKGRmXzIwMjAsIGNvdW50eXByZXMyMDIwXzJwLCBieSA9ICJmaXBzIikKCmRmXzIwMjBfY29tYmluZWQgPC0gbGVmdF9qb2luKGRmXzIwMjBfZWxlY3Rpb24sIGNvbnRyb2xzXzIwMTksIGJ5ID0gImZpcHMiKSAlPiUKICBtdXRhdGUoYXZnX2ltbWlfcmF0ZSA9IGZsb3dfYmEvdG90YWxfcG9wKQpgYGAKCgoKYGBge3J9CmRmIDwtIGRmXzIwMjBfY29tYmluZWQgJT4lCiAgZmlsdGVyKEdlb19TVEFURSAhPSAiMDIiICYmIEdlb19TVEFURSAhPSAiNzIiKQpgYGAKCmBgYHtyfQp3cml0ZS5jc3YoZGYsICJtaWdyYXRpb25fZGYuY3N2IikKYGBgCgoKYGBge3J9CmNvdW50eXByZXMyMDIwXzJwICU+JQogIGZpbHRlcihmaXBzID4gMjAwMCkgJT4lCiAgZmlsdGVyKGZpcHMgPCAzMDAwKSAlPiUKICBncm91cF9ieSgpICU+JQogIHN1bW1hcml6ZShjYW5kaWRhdGVfdm90ZXMgPSBzdW0oY2FuZGlkYXRldm90ZXMpLCB0b3RhbF8ycF92b3RlcyA9IHN1bSh0b3RhbF8ycF92b3RlcykpCmBgYAoKCgojIEltbWlncmF0aW9uCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgQmFzaWMgbGluZWFyIHJlZ3Jlc3Npb24Kc3RhcmdhemVyKGxtKGRlbV9wZXJjZW50IH4gYXZnX2ltbWlfcmF0ZSwgZGF0YSA9IGRmXzIwMjBfY29tYmluZWQsIHdlaWdodCA9IHRvdGFsX3BvcCksCiAgICAgICAgICB0eXBlID0gInRleHQiKQpgYGAKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyBWaXN1YWxpemF0aW9uIG9mIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGltbWlncmF0aW9uIHJhdGUgYW5kIGRlbSBwZXJjZW50CmdncGxvdChkZl8yMDIwX2NvbWJpbmVkLCBhZXMoeCA9IGF2Z19pbW1pX3JhdGUsIHkgPSBkZW1fcGVyY2VudCwgc2l6ZSA9IHRvdGFsX3BvcCkpICsKICBnZW9tX3BvaW50KGFscGhhID0gLjMpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhZXMod2VpZ2h0ID0gdG90YWxfcG9wKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGxhYnModGl0bGUgPSAiRmFsbCBpbiBEZW1vY3JhdGljIFZvdGluZyB3aXRoIEluY3JlYXNlIGluIFJhdGUgb2YgSW1taWdyYXRpb24iLAogICAgICAgeCA9ICJJbW1pZ3JhdGlvbiBSYXRlIiwKICAgICAgIHkgPSAiVHdvLVBhcnR5IERlbW9jcmF0aWMgVm90ZSBTaGFyZSIsCiAgICAgICBzdWJ0aXRsZSA9ICIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiIsCiAgICAgICBjYXB0aW9uID0gIldlaWdodGVkIGJ5IENvdW50eSBQb3B1bGF0aW9uIikKYGBgCgpDaGVjayBmb3IgbWlzc2luZyB2YWx1ZSBpbiB0aGUgZWNvbm9taWMgZGF0YQpDaGVjayBBbGFza2EhIQpXaGF0IGFyZSB0aGUgcGF0dGVybnMgd2UgZXhwZWN0IHRvIHNlZSBpZiB0aGlzIGlzIHRydWUsIGRvZXMgdGhlIGRhdGEgbG9vayBsaWtlIHdoYXQgaXQgd291bGQgaWYgdGhpcyBpcyBoYXBwZW5pbmcKSGF2ZSBhIGh5cG90aGVzaXMgdGhhdCB0aGlzIHNob3VsZCBpbXBhY3QgYmVoYXZpb3IsIGRvIHlvdSBzZWUgYSBwYXR0ZXJuIHRoYXQgaXNuJ3QgZXhwbGFpbmVkIGJ5IG90aGVyIHRoaW5ncwpNYXRjaGluZwpWaXJpZ2luaWEgcmVwb3J0cyBjaXRpZXMgYW5kIGNvdW50aWVzIGFyb3VuZCB0aGVtIGRpZmZlcmVudGx5IGFuZCBkb2Vzbid0IGxpbmUgdXAgLSBkcm9wIG9uZXMgdGhhdCBkb24ndCBhbGlnbiBjbGVhbmx5IChmaXBzIGNvZGVzIG1hdGNoZWQgdGhpbmdzIGFyZSB3ZWlyZCwgY2Vuc3VzIGhhcyB0aGUgZnVsbCBjb3VudHkgYnV0IHRoZSBkYXRhIGlzIHJlcG9ydGVkIHNwbGl0IGJldHdlZW4gdGhlIGNpdHkgYW5kIGV2ZXJ5dGhpbmcgZWxzZSkKS25vdyB0aGluZ3MgYWJvdXQgdGhlIHBsYWNlcyB0aGF0IHBlb3BsZSBhcmUgY29taW5nIGZyb20sIC0xLCAwLCAxIG5ldCBwYXJ0aXNhbnNoaXAgb2YgdGhlIHBlb3BsZSBtb3ZpbmcgaW50byBhbiBhcmVhLCBzb3J0aW5nLCBpbXBhY3Qgb24gcGVvcGxlIHRoZXJlCgpgYGB7ciwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0V9CiMgUmVncmVzc2lvbiB3aXRoIGNvbnRyb2xzCnN0YXJnYXplcihsbShkZW1fcGVyY2VudCB+IGF2Z19pbW1pX3JhdGUgKyBwZXJjZW50X3doaXRlICsgcGVyY2VudF9oaXNwYW5pYyArCiAgICAgICAgICAgICAgIHBlcmNlbnRfYmFjaGVsb3JzICsgYXZnX3dhZ2UgKyBwb3ZlcnR5ICsgdW5lbXAgKyBtZWRfaG91c2Vob2xkX2luY29tZSwgZGF0YSA9IGRmXzIwMjBfY29tYmluZWQsCiAgICAgICAgICAgICB3ZWlnaHQgPSB0b3RhbF9wb3ApLAogICAgICAgICAgbG0oZGVtX3BlcmNlbnQgfiBhdmdfaW1taV9yYXRlICsgcGVyY2VudF93aGl0ZSArIHBlcmNlbnRfaGlzcGFuaWMgKwogICAgICAgICAgICAgICBwZXJjZW50X2JhY2hlbG9ycywgZGF0YSA9IGRmXzIwMjBfY29tYmluZWQsCiAgICAgICAgICAgICB3ZWlnaHQgPSB0b3RhbF9wb3ApLAogICAgICAgICAgbG0oZGVtX3BlcmNlbnQgfiBhdmdfaW1taV9yYXRlICsgYXZnX3dhZ2UgKyBwb3ZlcnR5ICsgdW5lbXAgKyBtZWRfaG91c2Vob2xkX2luY29tZSwgZGF0YSA9IGRmXzIwMjBfY29tYmluZWQsCiAgICAgICAgICAgICB3ZWlnaHQgPSB0b3RhbF9wb3ApLAogICAgICAgICAgdHlwZSA9ICJ0ZXh0IikKYGBgCgoKYGBge3IsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQojIFJlZ3Jlc3Npb24gc3RhbmRhcmRpemVkCmRmXzIwMjBfY29tYmluZWQkZGVtX3BlcmNlbnRfc2NhbGVkIDwtIHNjYWxlKGRmXzIwMjBfY29tYmluZWQkZGVtX3BlcmNlbnQpWywgMV0KZGZfMjAyMF9jb21iaW5lZCRhdmdfaW1taV9yYXRlX3NjYWxlZCA8LSBzY2FsZShkZl8yMDIwX2NvbWJpbmVkJGF2Z19pbW1pX3JhdGUpWywgMV0KZGZfMjAyMF9jb21iaW5lZCRwZXJjZW50X3doaXRlX3NjYWxlZCA8LSBzY2FsZShkZl8yMDIwX2NvbWJpbmVkJHBlcmNlbnRfd2hpdGUpWywgMV0KZGZfMjAyMF9jb21iaW5lZCRwZXJjZW50X2JhY2hlbG9yc19zY2FsZWQgPC0gc2NhbGUoZGZfMjAyMF9jb21iaW5lZCRwZXJjZW50X2JhY2hlbG9ycylbLCAxXQpkZl8yMDIwX2NvbWJpbmVkJG1lZF9ob3VzZWhvbGRfaW5jb21lX3NjYWxlZCA8LSBzY2FsZShkZl8yMDIwX2NvbWJpbmVkJG1lZF9ob3VzZWhvbGRfaW5jb21lKVssIDFdCmRmXzIwMjBfY29tYmluZWQkcGVyY2VudF9oaXNwYW5pY19zY2FsZWQgPC0gc2NhbGUoZGZfMjAyMF9jb21iaW5lZCRwZXJjZW50X2hpc3BhbmljKVssIDFdCmRmXzIwMjBfY29tYmluZWQkYXZnX3dhZ2Vfc2NhbGVkIDwtIHNjYWxlKGRmXzIwMjBfY29tYmluZWQkYXZnX3dhZ2UpWywgMV0KZGZfMjAyMF9jb21iaW5lZCRwb3ZlcnR5X3NjYWxlZCA8LSBzY2FsZShkZl8yMDIwX2NvbWJpbmVkJHBvdmVydHkpWywgMV0KZGZfMjAyMF9jb21iaW5lZCR1bmVtcF9zY2FsZWQgPC0gc2NhbGUoZGZfMjAyMF9jb21iaW5lZCR1bmVtcClbLCAxXQoKc3RhcmdhemVyKGxtKGRlbV9wZXJjZW50X3NjYWxlZCB+IGF2Z19pbW1pX3JhdGVfc2NhbGVkICsgcGVyY2VudF93aGl0ZV9zY2FsZWQgKyBwZXJjZW50X2JhY2hlbG9yc19zY2FsZWQgKyAKICAgICAgICAgICAgICAgbWVkX2hvdXNlaG9sZF9pbmNvbWVfc2NhbGVkICsgcGVyY2VudF9oaXNwYW5pY19zY2FsZWQgKwogICAgICAgICAgICAgICBhdmdfd2FnZV9zY2FsZWQgKyBwb3ZlcnR5X3NjYWxlZCArIHVuZW1wX3NjYWxlZCwgZGF0YSA9IGRmXzIwMjBfY29tYmluZWQsCiAgICAgICAgICB3ZWlnaHQgPSB0b3RhbF9wb3ApLCB0eXBlID0gInRleHQiKQpgYGAKCiMgRW1pZ3JhdGlvbgoKYGBge3J9CmRmXzIwMjBfZW1pIDwtIGMyYzE1MTkgJT4lCiAgZmlsdGVyKGlzLm5hKGZpcHNfYikgPT0gRkFMU0UpICU+JQogIG11dGF0ZShjb21iX2ZpcHNfYSA9IHBhc3RlMChzdGF0ZV9jb2RlX2EsIGZpcHNfYSkpICU+JQogIGdyb3VwX2J5KGNvdW50eV9uYW1lX2EsIGNvbWJfZmlwc19hKSAlPiUKICBzdW1tYXJpemUoZmxvd19hYiA9IHN1bShhcy5udW1lcmljKGZsb3dfYWIpKSkgJT4lCiAgYXJyYW5nZShjb21iX2ZpcHNfYSkgJT4lCiAgbXV0YXRlKGZpcHMgPSBhcy5udW1lcmljKGNvbWJfZmlwc19hKSkKCmRmXzIwMjBfZWxlY3Rpb25fZW1pIDwtIGxlZnRfam9pbihkZl8yMDIwX2VtaSwgY291bnR5cHJlczIwMjBfMnAsIGJ5ID0gImZpcHMiKQoKZGZfMjAyMF9jb21iaW5lZF9lbWkgPC0gbGVmdF9qb2luKGRmXzIwMjBfZWxlY3Rpb25fZW1pLCBjb250cm9sc18yMDE5LCBieSA9ICJmaXBzIikgJT4lCiAgbXV0YXRlKGF2Z19lbWlfcmF0ZSA9IGZsb3dfYWIvdG90YWxfcG9wKQpgYGAKCmBgYHtyfQpkZl8yMDIwX2NvbWJpbmVkX2VtaSAlPiUKICBmaWx0ZXIoR2VvX1NUQVRFID09ICIwMiIpICU+JQogIGdyb3VwX2J5KCkgJT4lCiAgc3VtbWFyaXplKGZsb3dfYWIgPSBzdW0oZmxvd19hYikpCmBgYAoKCmBgYHtyfQpkZl9lbWkgPC0gZGZfMjAyMF9jb21iaW5lZF9lbWkgJT4lCiAgZmlsdGVyKEdlb19TVEFURSAhPSAiMDIiKSAlPiUKICBmaWx0ZXIoR2VvX1NUQVRFICE9ICI3MiIpCndyaXRlLmNzdihkZl9lbWksICJtaWdyYXRpb25fZGYyLmNzdiIpCmBgYAoKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KIyBCYXNpYyByZWdyZXNzaW9uCnN0YXJnYXplcihsbShkZW1fcGVyY2VudCB+IGF2Z19lbWlfcmF0ZSwgZGF0YSA9IGRmXzIwMjBfY29tYmluZWRfZW1pLCB3ZWlnaHQgPSB0b3RhbF9wb3ApLCB0eXBlID0gInRleHQiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGZfMjAyMF9jb21iaW5lZF9lbWksIGFlcyh4ID0gYXZnX2VtaV9yYXRlLCB5ID0gZGVtX3BlcmNlbnQsIHNpemUgPSB0b3RhbF9wb3ApKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC4zKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWVzKHdlaWdodCA9IHRvdGFsX3BvcCksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBsYWJzKHRpdGxlID0gIkZhbGwgaW4gRGVtb2NyYXRpYyBWb3Rpbmcgd2l0aCBJbmNyZWFzZSBpbiBSYXRlIG9mIEVtaWdyYXRpb24iLAogICAgICAgeCA9ICJFbWlncmF0aW9uIFJhdGUiLAogICAgICAgeSA9ICJUd28tUGFydHkgRGVtb2NyYXRpYyBWb3RlIFNoYXJlIiwKICAgICAgIHN1YnRpdGxlID0gIjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIiwKICAgICAgIGNhcHRpb24gPSAiV2VpZ2h0ZWQgYnkgQ291bnR5IFBvcHVsYXRpb24iKQpgYGAKCmBgYHtyLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0Kc3RhcmdhemVyKGxtKGRlbV9wZXJjZW50IH4gYXZnX2VtaV9yYXRlICsgcGVyY2VudF93aGl0ZSArIHBlcmNlbnRfaGlzcGFuaWMgKwogICAgICAgICAgICAgICBwZXJjZW50X2JhY2hlbG9ycyArIGF2Z193YWdlICsgcG92ZXJ0eSArIHVuZW1wICsgbWVkX2hvdXNlaG9sZF9pbmNvbWUsIGRhdGEgPSBkZl8yMDIwX2NvbWJpbmVkX2VtaSwKICAgICAgICAgICAgIHdlaWdodCA9IHRvdGFsX3BvcCksIAogICAgICAgICAgbG0oZGVtX3BlcmNlbnQgfiBhdmdfZW1pX3JhdGUgKyBwZXJjZW50X3doaXRlICsgcGVyY2VudF9oaXNwYW5pYyArCiAgICAgICAgICAgICAgIHBlcmNlbnRfYmFjaGVsb3JzLCBkYXRhID0gZGZfMjAyMF9jb21iaW5lZF9lbWksCiAgICAgICAgICAgICB3ZWlnaHQgPSB0b3RhbF9wb3ApLAogICAgICAgICAgbG0oZGVtX3BlcmNlbnQgfiBhdmdfZW1pX3JhdGUgKyBhdmdfd2FnZSArIHBvdmVydHkgKyB1bmVtcCArIG1lZF9ob3VzZWhvbGRfaW5jb21lLCBkYXRhID0gZGZfMjAyMF9jb21iaW5lZF9lbWksCiAgICAgICAgICAgICB3ZWlnaHQgPSB0b3RhbF9wb3ApLAogICAgICAgICAgdHlwZSA9ICJ0ZXh0IikKYGBgCgojIE1hcHMKCmBgYHtyfQpwbG90X3VzbWFwKGRhdGEgPSBkZl8yMDIwX2NvbWJpbmVkLCB2YWx1ZXMgPSAiYXZnX2ltbWlfcmF0ZSIsIHNpemUgPSAuMSkgKwogIHNjYWxlX2ZpbGxfY29udGludW91cyhsb3cgPSAid2hpdGUiLCAiaGlnaCIgPSAiYmxhY2siKSArCiAgbGFicyh0aXRsZSA9ICJJbnRlcm5hbCBJbW1pZ3JhdGlvbiBSYXRlcyBmcm9tIDIwMTUtMjAxOSIpCmBgYAoKYGBge3J9CnBsb3RfdXNtYXAoZGF0YSA9IGRmXzIwMjBfY29tYmluZWRfZW1pLCB2YWx1ZXMgPSAiYXZnX2VtaV9yYXRlIiwgc2l6ZSA9IC4xKSArCiAgc2NhbGVfZmlsbF9jb250aW51b3VzKGxvdyA9ICJ3aGl0ZSIsICJoaWdoIiA9ICJibGFjayIpICsKICBsYWJzKHRpdGxlID0gIkludGVybmFsIEVtaWdyYXRpb24gUmF0ZXMgZnJvbSAyMDE1LTIwMTkiKQpgYGAKCiMgUmVncmVzc2luZyBvbiBDb250cm9scwoKYGBge3J9CnN0YXJnYXplcihsbShwZXJjZW50X3doaXRlIH4gYXZnX2VtaV9yYXRlLCBkYXRhID0gZGZfMjAyMF9jb21iaW5lZF9lbWksIHdlaWdodCA9IHRvdGFsX3BvcCksCiAgICAgICAgICBsbShwZXJjZW50X2hpc3BhbmljIH4gYXZnX2VtaV9yYXRlLCBkYXRhID0gZGZfMjAyMF9jb21iaW5lZF9lbWksIHdlaWdodCA9IHRvdGFsX3BvcCksCiAgICAgICAgICBsbShwZXJjZW50X2JhY2hlbG9ycyB+IGF2Z19lbWlfcmF0ZSwgZGF0YSA9IGRmXzIwMjBfY29tYmluZWRfZW1pLCB3ZWlnaHQgPSB0b3RhbF9wb3ApLAogICAgICAgICAgdHlwZSA9ICJ0ZXh0IikKYGBgCgpgYGB7cn0Kc3RhcmdhemVyKGxtKHBlcmNlbnRfd2hpdGUgfiBhdmdfZW1pX3JhdGUsIGRhdGEgPSBkZl8yMDIwX2NvbWJpbmVkX2VtaSwgd2VpZ2h0ID0gdG90YWxfcG9wKSwKICAgICAgICAgIGxtKHBlcmNlbnRfaGlzcGFuaWMgfiBhdmdfZW1pX3JhdGUsIGRhdGEgPSBkZl8yMDIwX2NvbWJpbmVkX2VtaSwgd2VpZ2h0ID0gdG90YWxfcG9wKSwKICAgICAgICAgIGxtKHBlcmNlbnRfYmFjaGVsb3JzIH4gYXZnX2VtaV9yYXRlLCBkYXRhID0gZGZfMjAyMF9jb21iaW5lZF9lbWksIHdlaWdodCA9IHRvdGFsX3BvcCksCiAgICAgICAgICB0eXBlID0gInRleHQiKQpgYGAKCmBgYHtyfQpzdGFyZ2F6ZXIobG0oYXZnX3dhZ2UgfiBhdmdfZW1pX3JhdGUsIGRhdGEgPSBkZl8yMDIwX2NvbWJpbmVkX2VtaSwgd2VpZ2h0ID0gdG90YWxfcG9wKSwKICAgICAgICAgIGxtKHBvdmVydHkgfiBhdmdfZW1pX3JhdGUsIGRhdGEgPSBkZl8yMDIwX2NvbWJpbmVkX2VtaSwgd2VpZ2h0ID0gdG90YWxfcG9wKSwKICAgICAgICAgIGxtKHVuZW1wIH4gYXZnX2VtaV9yYXRlLCBkYXRhID0gZGZfMjAyMF9jb21iaW5lZF9lbWksIHdlaWdodCA9IHRvdGFsX3BvcCksCiAgICAgICAgICBsbShtZWRfaG91c2Vob2xkX2luY29tZSB+IGF2Z19lbWlfcmF0ZSwgZGF0YSA9IGRmXzIwMjBfY29tYmluZWRfZW1pLCB3ZWlnaHQgPSB0b3RhbF9wb3ApLAogICAgICAgICAgdHlwZSA9ICJ0ZXh0IikKYGBgCgoKVGhvdWdodHMgLSBhZGQgY29zdCBvZiBsaXZpbmcgaW50ZXJhY3Rpbmcgd2l0aCBhdmdfd2FnZT8KCmBgYHtyfQpzdGFyZ2F6ZXIobG0oYXZnX2ltbWlfcmF0ZSB+IGF2Z193YWdlLCBkYXRhID0gZGZfMjAyMF9jb21iaW5lZCwgd2VpZ2h0ID0gdG90YWxfcG9wKSwKICAgICAgICAgIGxtKGF2Z19pbW1pX3JhdGUgfiBwb3ZlcnR5LCBkYXRhID0gZGZfMjAyMF9jb21iaW5lZCwgd2VpZ2h0ID0gdG90YWxfcG9wKSwKICAgICAgICAgIGxtKGF2Z19pbW1pX3JhdGUgfiB1bmVtcCwgZGF0YSA9IGRmXzIwMjBfY29tYmluZWQsIHdlaWdodCA9IHRvdGFsX3BvcCksCiAgICAgICAgICBsbShhdmdfaW1taV9yYXRlIH4gbWVkX2hvdXNlaG9sZF9pbmNvbWUsIGRhdGEgPSBkZl8yMDIwX2NvbWJpbmVkLCB3ZWlnaHQgPSB0b3RhbF9wb3ApLAogICAgICAgICAgdHlwZSA9ICJ0ZXh0IikKYGBgCgoKYGBge3J9CmdncGxvdChkZl8yMDIwX2NvbWJpbmVkLCBhZXMoeCA9IGF2Z19pbW1pX3JhdGUsIHkgPSBwZXJjZW50X3doaXRlLCBzaXplID0gdG90YWxfcG9wKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFlcyh3ZWlnaHQgPSB0b3RhbF9wb3ApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicyh0aXRsZSA9ICJJbW1pZ3JhdGlvbiBSYXRlIGlzIEhpZ2hlciBpbiBDb3VudGllcyB3aXRoIEhpZ2hlciBXaGl0ZSBQcm9wb3J0aW9uIiwKICAgICAgIHggPSAiSW1taWdyYXRpb24gUmF0ZSIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gV2hpdGUiLAogICAgICAgc3VidGl0bGUgPSAiMjAxOSIsCiAgICAgICBjYXB0aW9uID0gIldlaWdodGVkIGJ5IENvdW50eSBQb3B1bGF0aW9uIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRmXzIwMjBfY29tYmluZWQsIGFlcyh4ID0gYXZnX2ltbWlfcmF0ZSwgeSA9IHBlcmNlbnRfaGlzcGFuaWMsIHNpemUgPSB0b3RhbF9wb3ApKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC4zKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWVzKHdlaWdodCA9IHRvdGFsX3BvcCksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBsYWJzKHRpdGxlID0gIkltbWlncmF0aW9uIFJhdGUgaXMgTG93ZXIgaW4gQ291bnRpZXMgd2l0aCBIaWdoZXIgSGlzcGFuaWMgUHJvcG9ydGlvbiIsCiAgICAgICB4ID0gIkltbWlncmF0aW9uIFJhdGUiLAogICAgICAgeSA9ICJQcm9wb3J0aW9uIEhpc3BhbmljIiwKICAgICAgIHN1YnRpdGxlID0gIjIwMTkiLAogICAgICAgY2FwdGlvbiA9ICJXZWlnaHRlZCBieSBDb3VudHkgUG9wdWxhdGlvbiIpCmBgYAoKYGBge3J9CmdncGxvdChkZl8yMDIwX2NvbWJpbmVkX2VtaSwgYWVzKHggPSBhdmdfZW1pX3JhdGUsIHkgPSBwZXJjZW50X3doaXRlLCBzaXplID0gdG90YWxfcG9wKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFlcyh3ZWlnaHQgPSB0b3RhbF9wb3ApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicyh0aXRsZSA9ICJFbWlncmF0aW9uIFJhdGUgaXMgSGlnaGVyIGluIENvdW50aWVzIHdpdGggSGlnaGVyIFdoaXRlIFByb3BvcnRpb24iLAogICAgICAgeCA9ICJFbWlncmF0aW9uIFJhdGUiLAogICAgICAgeSA9ICJQcm9wb3J0aW9uIFdoaXRlIiwKICAgICAgIHN1YnRpdGxlID0gIjIwMTkiLAogICAgICAgY2FwdGlvbiA9ICJXZWlnaHRlZCBieSBDb3VudHkgUG9wdWxhdGlvbiIpCmBgYAoKYGBge3J9CmdncGxvdChkZl8yMDIwX2NvbWJpbmVkX2VtaSwgYWVzKHggPSBhdmdfZW1pX3JhdGUsIHkgPSBwZXJjZW50X2hpc3BhbmljLCBzaXplID0gdG90YWxfcG9wKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFlcyh3ZWlnaHQgPSB0b3RhbF9wb3ApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicyh0aXRsZSA9ICJFbWlncmF0aW9uIFJhdGUgaXMgTG93ZXIgaW4gQ291bnRpZXMgd2l0aCBIaWdoZXIgSGlzcGFuaWMgUHJvcG9ydGlvbiIsCiAgICAgICB4ID0gIkVtaWdyYXRpb24gUmF0ZSIsCiAgICAgICB5ID0gIlByb3BvcnRpb24gSGlzcGFuaWMiLAogICAgICAgc3VidGl0bGUgPSAiMjAxOSIsCiAgICAgICBjYXB0aW9uID0gIldlaWdodGVkIGJ5IENvdW50eSBQb3B1bGF0aW9uIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRmXzIwMjBfY29tYmluZWQsIGFlcyh4ID0gYXZnX2ltbWlfcmF0ZSwgeSA9IHBlcmNlbnRfYmFjaGVsb3JzLCBzaXplID0gdG90YWxfcG9wKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAuMykgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFlcyh3ZWlnaHQgPSB0b3RhbF9wb3ApLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicyh0aXRsZSA9ICJJbW1pZ3JhdGlvbiBSYXRlIGlzIEhpZ2hlciBpbiBDb3VudGllcyB3aXRoIEhpZ2hlciBCYWNoZWxvcidzIFByb3BvcnRpb24iLAogICAgICAgeCA9ICJJbW1pZ3JhdGlvbiBSYXRlIiwKICAgICAgIHkgPSAiUGVyY2VudCBCYWNoZWxvcidzIERlZ3JlZSIsCiAgICAgICBzdWJ0aXRsZSA9ICIyMDE5IiwKICAgICAgIGNhcHRpb24gPSAiV2VpZ2h0ZWQgYnkgQ291bnR5IFBvcHVsYXRpb24iKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGZfMjAyMF9jb21iaW5lZF9lbWksIGFlcyh4ID0gYXZnX2VtaV9yYXRlLCB5ID0gcGVyY2VudF9iYWNoZWxvcnMsIHNpemUgPSB0b3RhbF9wb3ApKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IC4zKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWVzKHdlaWdodCA9IHRvdGFsX3BvcCksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBsYWJzKHRpdGxlID0gIkVtaWdyYXRpb24gUmF0ZSBpcyBIaWdoZXIgaW4gQ291bnRpZXMgd2l0aCBIaWdoZXIgQmFjaGVsb3IncyBQcm9wb3J0aW9uIiwKICAgICAgIHggPSAiRW1pZ3JhdGlvbiBSYXRlIiwKICAgICAgIHkgPSAiUGVyY2VudCBCYWNoZWxvcidzIERlZ3JlZSIsCiAgICAgICBzdWJ0aXRsZSA9ICIyMDE5IiwKICAgICAgIGNhcHRpb24gPSAiV2VpZ2h0ZWQgYnkgQ291bnR5IFBvcHVsYXRpb24iKQpgYGAKCgo=